package org.ala.tiktools.rpc.plugin.interceptor;

import java.lang.reflect.Method;
import java.util.Map;


/**
 *	请求拦截器，对方法进行拦截
 *	<p>	拦截器抛出任何异常均打断原有执行过程
 *	<p>	对客户端而言：拦截器本身无法打断方法执行，只是在执行前做一些公共的事情
 *	<p>	自定义的拦截器如果与公共拦截器的sort值相同，将执行自定义拦截器
 *
 *	@author ala
 *	@date 2025年4月23日
 */
public interface IRpcInterceptor {
	/**
	 * 	空值
	 */
	public static IRpcInterceptor NULL = new IRpcInterceptor() {
		public void doIntercept(Method method, Object[] args, Map<String, Object> metadata) {}
		public void afterIntercept(Method method, Object[] args, Object res, Map<String, Object> metadata) {}
		public int sort() {return Integer.MAX_VALUE;}
	};
	
	
	/**
	 * 	拦截请求
	 * 	<p>	抛出任何异常均打断原有执行
	 * 	@param	args		原本要调用的方法参数
	 * 	@param	metadata	本次请求元数据，类似http-header
	 */
	void doIntercept(Method method, Object[] args, Map<String, Object> metadata) throws Exception;
	/**
	 * 	请求执行完成后执行
	 * 	<p>	抛出任何异常均不会打断原有执行，因为也无法打断，这是原方法执行完成后执行的
	 *	@param	args		原本要调用的方法参数
	 * 	@param	metadata	本次请求元数据，类似http-header
	 */
	void afterIntercept(Method method, Object[] args, Object res, Map<String, Object> metadata) throws Exception;
	/**
	 * 	拦截器的执行顺序
	 */
	int sort();
}
